package com.l.pay.wxpay;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 微信支付核心类
 * 
 * @author qipeng
 * @version 1.0
 */
public class WxPayCore {
	/**
	 * 去除数组的空值和签名参数
	 * 
	 * @param sArray 签名签名参数组
	 *            
	 * @return 去掉空值与签名参数后的新签名参数组
	 */
	public static Map<String, String> paraFilter(Map<String, String> sArray) {
		Map<String, String> result = new HashMap<String, String>();
		if (sArray == null || sArray.size() <= 0) {
			return result;
		}
		for (String key : sArray.keySet()) {
			String value = sArray.get(key);
			if (value == null || value.equals("") || key.equals("sign")) {
				continue;
			}
			result.put(key, value);
		}
		return result;
	}

	/**
	 * 把数组所有元素排序，并按照“参数=参数值”的模式用“&”字符拼接成字符串
	 * 
	 * @param params 需要排序并参与字符拼接的参数组
	 *            
	 * @return 拼接后的字符串
	 */
	public static String createLinkString(Map<String, String> params) {

		List<String> keys = new ArrayList<String>(params.keySet());
		Collections.sort(keys);
		String prestr = "";
		for (int i = 0; i < keys.size(); i++) {
			String key = keys.get(i);
			String value = params.get(key);
			if (i == keys.size() - 1) {
				prestr = prestr + key + "=" + value;
			} else {
				prestr = prestr + key + "=" + value + "&";
			}
		}
		return prestr;
	}

	/**
	 * 对排序拼接后的字符串连上KEY进行MD5运算并把结果转换为大写
	 * 
	 * @param prestr 拼接后的字符串
	 * @return sign
	 */
	public static String signValue(String prestr) {
		// 在prestr最后拼接上key得到stringSignTemp字符串
		String stringSignTemp = prestr + "&key=" + WxPayConfig.key;
		// 对stringSignTemp进行MD5运算，再将得到的字符串所有字符转换为大写，得到sign值signValue。
		MD5 md5 = new MD5();
		String sign = md5.ToMD5(stringSignTemp).toUpperCase();
		return sign;
	}

	/**
	 * 请求参数Sign生成和参数拼接 生成请求的URL
	 * 
	 * @return 拼接后的字符串
	 */
	public static Map<String, String> buildRequestPara(Map<String, String> sArray) {
		// 生成签名
		String s = createLinkString(paraFilter(sArray));
		String sign = signValue(s);
		sArray.put("sign", sign);
		return sArray;
	}
}